package deposito.dao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import deposito.dto.Articulo;
import deposito.dto.Electrodomestico;
import deposito.dto.Moda;
import deposito.dto.Mueble;
import deposito.dto.Ninio;
import deposito.dto.Stock;
import deposito.entities.ArticuloEntity;
import deposito.entities.ElectrodomesticoEntity;
import deposito.entities.ModaEntity;
import deposito.entities.MuebleEntity;
import deposito.entities.NinioEntity;


@Stateless
public class ArticuloDAO implements IArticuloDAO {

	@EJB
	IStockDAO iStockDAO;
	
	//Entity Manager
	@PersistenceContext(unitName="IA_DS")
	private EntityManager manager;

	
    //buscarArticulo (por PK)
    public Articulo buscarArticulo(int codigoArticulo)
    {
    	try
    	{
	    	ArticuloEntity artiE = manager.find(ArticuloEntity.class, codigoArticulo);
	    	
	    	if(artiE instanceof ElectrodomesticoEntity)
				return ((ElectrodomesticoEntity) artiE).toDTO();
			else if(artiE instanceof ModaEntity)
				return ((ModaEntity) artiE).toDTO();
			else if(artiE instanceof MuebleEntity)
				return ((MuebleEntity) artiE).toDTO();
			else return ((NinioEntity) artiE).toDTO();
    	}
    	catch(Exception e)
    	{
    		System.out.print(e.getMessage());
    		return null;
    	}
    } 
    
    
    //persistirArticulo
    public void persistirArticulo(Articulo articulo){
    	articulo.setFecha(Calendar.getInstance().getTime());
    	manager.persist(toEntity(articulo));
    	
    	//Creo registro de Stock por default con cantidad 0
    	Stock stock = new Stock();
    	stock.setArticulo(articulo);
    	stock.setCantidad(0);    	
    	iStockDAO.persistirStock(stock);
    }
       
    
    //***** CONSULTAS JPQL *****//
    
    
    //existeInstancia
    public boolean existeArticulo(int codigoArticulo){
  
    	boolean resultado = false;
		Query q = manager.createQuery("select count(*) from ArticuloEntity aE where aE.codigo = ?").setParameter(1, codigoArticulo);
		
		Long  cant = (Long) q.getSingleResult();
		if(cant > 0)
			resultado = true;

    	return resultado;
    }
    
    
    //getArticulos
	@SuppressWarnings("unchecked")
	//getArticulos
	public List<Articulo> getArticulos(){

		List<Articulo> lista = new ArrayList<Articulo>();
		
		String query = "from ArticuloEntity aE";
		Query q = manager.createQuery(query);
		
		List<ArticuloEntity> listaE = (List<ArticuloEntity>) q.getResultList();
		if(listaE != null){
			for(ArticuloEntity elemE: listaE){
		    	if(elemE instanceof ElectrodomesticoEntity)
		    		lista.add(((ElectrodomesticoEntity) elemE).toDTO());
		    	else if(elemE instanceof ModaEntity)
		    		lista.add(((ModaEntity) elemE).toDTO());
		    	else if(elemE instanceof MuebleEntity)
		    		lista.add(((MuebleEntity) elemE).toDTO());
		    	else lista.add(((NinioEntity) elemE).toDTO());	
			}
		}
		return lista;
	}
	
	
	//toEntity
	public ArticuloEntity toEntity(Articulo articulo){
		
    	if(articulo instanceof Electrodomestico){
    		Electrodomestico e = (Electrodomestico) articulo;		
    		ElectrodomesticoEntity eE = new ElectrodomesticoEntity();
    		eE.setCodigo(e.getCodigo());
    		eE.setNombre(e.getNombre());
    		eE.setDescripcion(e.getDescripcion());
    		eE.setMarca(e.getMarca());
    		eE.setOrigen(e.getOrigen());
    		eE.setPrecio(e.getPrecio());
    		eE.setFotoURL(e.getFotoURL());
    		eE.setFecha(e.getFecha());
    		eE.setFichaTecnica(e.getFichaTecnica());
    		return(eE);
    	}
		else if(articulo instanceof Moda){
    		Moda m = (Moda) articulo;		
    		ModaEntity mE = new ModaEntity();
    		mE.setCodigo(m.getCodigo());
    		mE.setNombre(m.getNombre());
    		mE.setDescripcion(m.getDescripcion());
    		mE.setMarca(m.getMarca());
    		mE.setOrigen(m.getOrigen());
    		mE.setPrecio(m.getPrecio());
    		mE.setFotoURL(m.getFotoURL());
    		mE.setFecha(m.getFecha());
    		mE.setTalle(m.getTalle());
    		mE.setColor(m.getColor());
    		return(mE);
		}
		else if(articulo instanceof Mueble){
    		Mueble mu = (Mueble) articulo;		
    		MuebleEntity muE = new MuebleEntity();
    		muE.setCodigo(mu.getCodigo());
    		muE.setNombre(mu.getNombre());
    		muE.setDescripcion(mu.getDescripcion());
    		muE.setMarca(mu.getMarca());
    		muE.setOrigen(mu.getOrigen());
    		muE.setPrecio(mu.getPrecio());
    		muE.setFotoURL(mu.getFotoURL());
    		muE.setFecha(mu.getFecha());
    		muE.setMaterial(mu.getMaterial());
    		return(muE);
		}
		else {
    		Ninio n = (Ninio) articulo;		
    		NinioEntity nE = new NinioEntity();
    		nE.setCodigo(n.getCodigo());
    		nE.setNombre(n.getNombre());
    		nE.setDescripcion(n.getDescripcion());
    		nE.setMarca(n.getMarca());
    		nE.setOrigen(n.getOrigen());
    		nE.setPrecio(n.getPrecio());
    		nE.setFotoURL(n.getFotoURL());
    		nE.setFecha(n.getFecha());
    		nE.setEdadRecomendada(n.getEdadRecomendada());
    		return(nE);
		}		
	}
	    
}
